package com.lucene.test.service;

import com.lucene.test.common.Page;
import com.lucene.test.common.PageData;
import com.lucene.test.pojo.BaseIndexEntity;
import org.apache.lucene.document.Document;
import org.apache.lucene.search.Query;

import java.util.Collection;
import java.util.List;

/**
 * 搜索接口
 * @author zoumy9
 * @date 2024/05/23 16:27
 **/
public interface ILuceneSearch {

    /**
     * 新增或者更新
     * @param entity
     */
    void insertUpdateIndex(BaseIndexEntity entity);

    /**
     * 基于id增量批量新增索引
     * @Param list
     */
    void insertBatch(Collection<? extends BaseIndexEntity> list);

    /**
     * 基于id批量新增或者更新索引
     * update可以自校验id是否存在，存在则更新，不存在则新增
     * @Param list
     */
    void updateBatch(Collection<? extends BaseIndexEntity> list);

    /**
     * 用于分页检索满足条件的doc，默认按照ID正序排列
     * @param query 查询条件
     * @param page 查询页数
     * @return 分页对象
     */
    PageData<List<? extends BaseIndexEntity>> pageQuery(Query query, Page page);

    /**
     * 用于分页检索满足条件的doc
     * @param query 查询条件
     * @param page 查询页数
     * @param reverse 是否按照ID倒序排列
     * @return 分页对象
     */
    PageData<List<? extends BaseIndexEntity>> pageQuery(Query query, Page page, boolean reverse);

    /**
     * 用于查询满足条件的文档数，默认按照ID正序排列
     * @param query 查询条件
     * @return
     */
    List<? extends BaseIndexEntity> queryList(Query query);

    /**
     * 用于查询满足条件的文档数；
     * @param query 查询条件
     * @param reverse 是否按照ID倒序排列
     * @return
     */
    List<? extends BaseIndexEntity> queryList(Query query, boolean reverse);

    /**
     * 转换成索引Doc
     * @param entity 存储对象
     * @return
     */
    Document convert(BaseIndexEntity entity);


    /**
     * 根据ID查询
     * @param id 存储对象ID
     * @return BaseIndexEntity
     */
    BaseIndexEntity getById(Long id);

    /**
     * 基于id增量批量新增索引（无锁，用于测试）
     * @Param list
     */
    void insertNoLock(Collection<? extends BaseIndexEntity> list);
}
